package org.x.common.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import java.util.Random;

@Service
public class SmsServiceImpl implements SmsService {

    private static final Logger log = LoggerFactory.getLogger(SmsServiceImpl.class);

    /**
     * 发送短信验证码
     *
     * @param phone 手机号
     */
    @Override
    public void sendSmsCode(String phone) {
        // 检查是否允许发送验证码
        if (!isAllowedToSend(phone)) {
            throw new IllegalArgumentException("请稍后再试，验证码发送过于频繁");
        }

        // 生成随机验证码
        String code = generateRandomCode();

        // 存储验证码到缓存中
        SmsCache.saveCode(phone, code);
        log.info("Generated and saved SMS Code for phone {}: {}", phone, code);

        // 调用短信服务发送验证码
        sendSmsToUser(phone, code);
        log.info("SMS Code sent to phone: {}", phone);
    }

    /**
     * 检查是否允许发送验证码
     *
     * @param phone 手机号
     * @return 是否允许发送
     */
    private boolean isAllowedToSend(String phone) {
        String lastCode = SmsCache.getCode(phone);
        if (lastCode == null) {
            return true; // 如果没有之前的验证码，允许发送
        }

        long currentTime = System.currentTimeMillis();
        long lastSentTime = SmsCache.getLastSentTime(phone); // 获取上次发送时间
        return currentTime - lastSentTime > 60 * 1000; // 60秒内不允许重复发送
    }

    /**
     * 生成一个6位随机数字验证码
     *
     * @return 验证码字符串
     */
    private String generateRandomCode() {
        Random random = new Random();
        int code = 100000 + random.nextInt(900000); // 生成6位随机数
        return String.valueOf(code);
    }

    /**
     * 调用短信服务发送验证码
     *
     * @param phone 手机号
     * @param code  验证码
     */
    private void sendSmsToUser(String phone, String code) {
        // 示例：调用第三方短信服务商API
        System.out.println("Sending SMS to " + phone + " with code: " + code);

        // 实际实现中，这里应调用短信服务提供商的SDK或API
        // 示例：使用阿里云短信服务
        // SmsClient client = new SmsClient("your-access-key", "your-secret-key");
        // SendSmsRequest request = new SendSmsRequest();
        // request.setPhoneNumbers(phone);
        // request.setSignName("您的签名");
        // request.setTemplateCode("SMS模板ID");
        // request.setTemplateParam("{\"code\":\"" + code + "\"}");
        // client.sendSms(request);
    }
}

